﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using DataBase.Programa;
using System.Globalization;
using System.Collections.ObjectModel;
using Model;

namespace Processes.Programa
{
    public class GestorPrograma
    {
        public static Collection<Model.Programa> MostrarTodos(long id,long idPresi)
        {
            Collection<Model.Programa> list;
            try
            {
                list = new Collection<Model.Programa>();
                list = BDPrograma.DevolverTodosLosProgramas(id,idPresi);
            }
            catch (Exception)
            {
                throw;
            }
            return list;
        }
        public static Collection<Model.Programa> Buscar(String sentence, String category,bool check,long id,long idpresi)
        {
            String[] words = null;
            String format = @"^[a-zA-Z0-9 ]";
            if (!String.IsNullOrEmpty(sentence))
            {
                if (!Regex.IsMatch(sentence, format))
                {
                    throw new Exception("Formato incorrecto");
                }
                words = SeparateWords(sentence);
            }
            Collection<Model.Programa> allPrograms = new Collection<Model.Programa>();
            Collection<Model.Programa> resp = new Collection<Model.Programa>();
            
           allPrograms = ProgramsByCategory(category,check,id,idpresi);
            if (allPrograms != null && allPrograms.Count!=0)
            {
                if (words != null)
                {
                    allPrograms = GetSearchProducts(words, allPrograms);
                    resp = allPrograms;
                }
                else
                {
                    resp = allPrograms;
                }
            }
            else
            {
                throw new Exception("No existen programas de "+category);
            }
            return resp;
        }
        public static String[] SeparateWords(String sentence)
        {
            String[] words = null;
            if (!String.IsNullOrEmpty(sentence))
            {
                words = sentence.Split(' ');
            }
            return words;
        }
        public static Collection<Model.Programa> GetSearchProducts(String[] words, Collection<Model.Programa> products)
        {
            Collection<Model.Programa> resp = new Collection<Model.Programa>();
            if (products != null && products.Count != 0)
            {
                if (words != null && words.Length != 0)
                {
                    foreach (String word in words)
                    {
                        foreach (Model.Programa prod in products)
                        {
                            String name = prod.Nombre.ToLower(CultureInfo.CurrentCulture);
                            String lword = word.ToLower(CultureInfo.CurrentCulture);
                            if (!String.IsNullOrEmpty(word) && name.Contains(lword))
                            {
                                resp.Add(prod);

                            }
                        }
                    }
                }
            }
            return resp;
        }
        public static Collection<Model.Programa> ProgramsByCategory(String category,bool check,long id,long idpresi)
        {
             
            Collection<Model.Programa> programas = new Collection<Model.Programa>();
            if (!String.IsNullOrEmpty(category))
            {
                if (check)
                {
                    programas = BDPrograma.DevolverTodosLosProgramas(0,0);
                }
                else
                {
                    programas = BDPrograma.ProgramasCategoria(category,id,idpresi);
                    
                }
            }
            else
            {
                throw new Exception("");
            }
            return programas;
        }
        public static void ModificarPrograma(String nombre, String fechaInicio, String fechafin, String area, Miembroo directora,String inicial,long codigo)
        {
            Model.Programa nuevoPro = new Model.Programa();
            String format = @"^[a-zA-Z0-9 ]";
            if (!String.IsNullOrEmpty(nombre))
            {
                if (!Regex.IsMatch(nombre, format))
                {
                    throw new Exception("Caracteres no permitidos");
                }
            }
            else
            {
                throw new Exception("Todos los campos son obligatorios");
            }

            if (String.IsNullOrEmpty(fechafin) || String.IsNullOrEmpty(fechaInicio))
            {

                throw new Exception("Error de formato en la fecha de conclusion");
            }
            DateTime ff = Convert.ToDateTime(fechafin, CultureInfo.CurrentCulture);
            DateTime fi = Convert.ToDateTime(fechaInicio, CultureInfo.CurrentCulture);
            if (ff < fi)
            {
                throw new Exception("La fecha de conclusion debe ser mayor que la fecha de inicio");
            }
            try
            {
                if (BDPrograma.ProgramasIguales(nombre, fi) == null || nombre==inicial)
                {
                    nuevoPro.Nombre = nombre;
                    nuevoPro.CIDirectora = directora.CI;
                    nuevoPro.FechaInicio = fi;
                    nuevoPro.FechaFin = ff;
                    nuevoPro.Area = area;
                    nuevoPro.CodigoPrograma = codigo;
                    BDPrograma.ModificarPrograma(nuevoPro);
                }
                else
                    throw new Exception("El programa ya existe");
            }
            catch (Exception)
            {
                throw;
            }
        }
        public static Model.Programa CrearPrograma(String nombre, String fechaInicio, String fechafin, String area,Miembroo directora,long id)
        {
           Model.Programa nuevoPro = new Model.Programa();
            String format = @"^[a-zA-Z0-9 ]*$";
            if (!String.IsNullOrEmpty(nombre))
            {
                if (!Regex.IsMatch(nombre,format))
                {
                    throw new Exception("Caracteres no permitidos");
                }
            }
            else
            {
                throw new Exception("Todos los campos son obligatorios"); 
            }
            if (String.IsNullOrEmpty(fechafin) || String.IsNullOrEmpty(fechaInicio))
            {
                throw new Exception("Todos los campos son obligatorio");
            }
            DateTime ff = Convert.ToDateTime(fechafin, CultureInfo.CurrentCulture);
            DateTime fi=Convert.ToDateTime(fechaInicio,CultureInfo.CurrentCulture);
            if (ff <= fi)
            {
                throw new Exception("La fecha de conclusion debe ser mayor que la fecha de inicio");
            }
            if (ff.Year != DateTime.Now.Year || fi.Year!=DateTime.Now.Year)
            {
                throw new Exception("La fecha de inicio y la fecha de conclusion deben pertenecer a la presente gestion");
            }
            try
            {
                if (BDPrograma.ProgramasIguales(nombre, fi) == null)
                {
                    nuevoPro.Nombre = nombre;
                    nuevoPro.CIDirectora = directora.CI;
                    nuevoPro.FechaInicio = fi;
                    nuevoPro.FechaFin = ff;
                    nuevoPro.Area = area;
                    nuevoPro.CreadoPor = id;
                    return BDPrograma.CrearPrograma(nuevoPro);
                }
                else
                    throw new Exception("El programa ya existe");
            }catch(Exception)
            {
                throw ;
            }

        }


        public static Collection<Model.Programa> BuscarCerrados(String sentence, String category, bool check, long id, long idpresi)
        {
            String[] words = null;
            String format = @"^[a-zA-Z0-9 ]";
            if (!String.IsNullOrEmpty(sentence))
            {
                if (!Regex.IsMatch(sentence, format))
                {
                    throw new Exception("Formato incorrecto");
                }
                words = SeparateWords(sentence);
            }
            Collection<Model.Programa> allPrograms = new Collection<Model.Programa>();
            Collection<Model.Programa> resp = new Collection<Model.Programa>();

            allPrograms = ClosedProgramsByCategory(category, check, id, idpresi);
            if (allPrograms != null && allPrograms.Count != 0)
            {
                if (words != null)
                {
                    allPrograms = GetSearchProducts(words, allPrograms);
                    resp = allPrograms;
                }
                else
                {
                    resp = allPrograms;
                }
            }
            else
            {
                throw new Exception("No existen programas de " + category);
            }
            return resp;
        }

        private static Collection<Model.Programa> ClosedProgramsByCategory(string category, bool check, long id, long idpresi)
        {
               Collection<Model.Programa> programas = new Collection<Model.Programa>();
               if (!String.IsNullOrEmpty(category))
               {
                   if (check)
                   {
                       programas = BDPrograma.DevolverTodosLosProgramasCerrados(0, 0);
                   }
                   else
                   {
                       programas = BDPrograma.ProgramasCategoriaCerrado(category, id, idpresi);

                   }
               }
               else
               {
                   throw new Exception("");
               }
               return programas;
        }

        public static Collection<Model.Programa> MostrarTodosCerrados(long id, long idPresi)
        {
            Collection<Model.Programa> list;
            try
            {
                list = new Collection<Model.Programa>();
                list = BDPrograma.DevolverTodosLosProgramasCerrados(id, idPresi);
            }
            catch (Exception)
            {
                throw;
            }
            return list;
        }
    }
}
